// Commands.h : header file
//

#if !defined(AFX_COMMANDS_H__33E78139_5371_4906_AE99_889F550AF93E__INCLUDED_)
#define AFX_COMMANDS_H__33E78139_5371_4906_AE99_889F550AF93E__INCLUDED_

#include "PBGenieTypes.h"
#include "PBGenie.h"

class CCommands : 
	public CComDualImpl<ICommands, &IID_ICommands, &LIBID_PBGenie>, 
	public CComObjectRoot,
	public CComCoClass<CCommands, &CLSID_Commands>
{
protected:
	IApplication* m_pApplication;

public:
	CCommands();
	~CCommands();
	void SetApplicationObject(IApplication* m_pApplication);
	IApplication* GetApplicationObject() { return m_pApplication; }
	void UnadviseFromEvents();

	BEGIN_COM_MAP(CCommands)
		COM_INTERFACE_ENTRY(IDispatch)
		COM_INTERFACE_ENTRY(ICommands)
	END_COM_MAP()
	DECLARE_NOT_AGGREGATABLE(CCommands)

protected:
	// This class template is used as the base class for the Application
	//  event handler object and the Debugger event handler object,
	//  which are declared below.
	template <class IEvents, const IID* piidEvents, const GUID* plibid,
		class XEvents, const CLSID* pClsidEvents>
	class XEventHandler :
		public CComDualImpl<IEvents, piidEvents, plibid>,
		public CComObjectRoot,
		public CComCoClass<XEvents, pClsidEvents>
	{
	public:
		BEGIN_COM_MAP(XEvents)
			COM_INTERFACE_ENTRY(IDispatch)
			COM_INTERFACE_ENTRY_IID(*piidEvents, IEvents)
		END_COM_MAP()
		DECLARE_NOT_AGGREGATABLE(XEvents)
		void Connect(IUnknown* pUnk)
		{ VERIFY(SUCCEEDED(AtlAdvise(pUnk, this, *piidEvents, &m_dwAdvise))); }
		void Disconnect(IUnknown* pUnk)
		{ AtlUnadvise(pUnk, *piidEvents, m_dwAdvise); }

		CCommands* m_pCommands;

	protected:
		DWORD m_dwAdvise;
	};

	// This object handles events fired by the Application object
	class XApplicationEvents : public XEventHandler<IApplicationEvents, 
		&IID_IApplicationEvents, &LIBID_PBGenie, 
		XApplicationEvents, &CLSID_ApplicationEvents>
	{
	public:
		// IApplicationEvents methods
		STDMETHOD(BeforeBuildStart)(THIS);
		STDMETHOD(BuildFinish)(THIS_ long nNumErrors, long nNumWarnings);
		STDMETHOD(BeforeApplicationShutDown)(THIS);
		STDMETHOD(DocumentOpen)(THIS_ IDispatch * theDocument);
		STDMETHOD(BeforeDocumentClose)(THIS_ IDispatch * theDocument);
		STDMETHOD(DocumentSave)(THIS_ IDispatch * theDocument);
		STDMETHOD(NewDocument)(THIS_ IDispatch * theDocument);
		STDMETHOD(WindowActivate)(THIS_ IDispatch * theWindow);
		STDMETHOD(WindowDeactivate)(THIS_ IDispatch * theWindow);
		STDMETHOD(WorkspaceOpen)(THIS);
		STDMETHOD(WorkspaceClose)(THIS);
		STDMETHOD(NewWorkspace)(THIS);
		STDMETHOD(DownloadResult)(THIS);
	};
	typedef CComObject<XApplicationEvents> XApplicationEventsObj;
	XApplicationEventsObj* m_pApplicationEventsObj;

	// This object handles events fired by the Application object
	class XDebuggerEvents : public XEventHandler<IDebuggerEvents, 
		&IID_IDebuggerEvents, &LIBID_PBGenie, 
		XDebuggerEvents, &CLSID_DebuggerEvents>
	{
	public:
		// IDebuggerEvents method
	    STDMETHOD(BreakpointHit)(THIS_ IDispatch * pBreakpoint);
	};
	typedef CComObject<XDebuggerEvents> XDebuggerEventsObj;
	XDebuggerEventsObj* m_pDebuggerEventsObj;

public:
	STDMETHOD(Addwhile)();
	STDMETHOD(Addifelse)();
	STDMETHOD(Addif)();

	//STDMETHODIMP CopyTextToFile();
	//STDMETHODIMP AddCodeComment();
	//STDMETHODIMP LoadCodeFromFile();
	//HRESULT PutCodeComment(IDispatch *pTextSel);
	HRESULT LoadTextFromFile(IDispatch *pTextSel);
	HRESULT UnCommentSelectedCodeN(IDispatch *pTextSel);
	HRESULT CommentSelectedCodeN(IDispatch *pTextSel);
	HRESULT UnCommentSelectedCode(IDispatch * pTextSelection);
	HRESULT CommentSelectedCode(IDispatch *pTextSel);
	HRESULT GetTextSelection(IApplication *pApplication);
	HRESULT JudgeCommentOrUncomment(IDispatch *pTextSel);
	STDMETHOD(UncommentCodeN)();
	STDMETHOD(CommentCodeN)();
	STDMETHOD(UncommentCode)();
	STDMETHOD(CommentCode)();
	STDMETHOD(SwitchHCpp)();
// ICommands methods
	STDMETHOD(PBGenieCommandMethod)(THIS);

protected:
	BOOL    FileExist(CString strFileName);
	void    DoActivateDoc(LPCTSTR FullName);

	HRESULT PutCodeComment(IDispatch * pTextSel);
	HRESULT SaveTextToFile(IDispatch * pTextSel);
	CComPtr<IDispatch> m_pTextselect;

	//new added [20091227]
	CString     TemplateIf(const CString & spaces, CString & selText, int & nCursorOffset);
	CString     TemplateIfElse(const CString & spaces, CString & selText, int & nCursorOffset);
	CString     TemplateWhile(const CString & spaces, CString & selText, int & nCursorOffset);
	BOOL        CheckForTextType(); 
	
	BOOL        m_working; 
};

typedef CComObject<CCommands> CCommandsObj;

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_COMMANDS_H__33E78139_5371_4906_AE99_889F550AF93E__INCLUDED)
